目标是开发一个SDK,嵌入到APP里面,用来统计当前APP的实时CPU、内存等信息
2015.11.17
http://stackoverflow.com/questions/12889422/ios-cpu-usage-for-each-process-using-sysctl
这是第一个找到,采用的是sysctl函数
但是出来的CPU数据和instrument、GT的数据对不上(后两者数据比较接近)
2015.11.19
https://github.com/TianJIANG/ios_monitor
从guithub上搜到的,利用的主要是#import
http://stackoverflow.com/questions/8223348/ios-get-cpu-usage-from-application
这个答案也是给的这个方法,末尾额外加了一行代码, vm_dealloc,解决leaking问题
补充几个相关的:
http://stackoverflow.com/questions/5182924/where-is-my-ipad-runtime-memory-going%E2%80%8C%E2%80%8B
http://blog.sina.com.cn/s/blog_693de6100101ffwm.html
http://www.zhihu.com/question/22992491
Github 搜 “Activity Monitor”
https://github.com/AndrewBarba/ActivityMonitor
https://github.com/vsnrain/ActivityMonitor
此算法是获取当前APP的CPU,数值与Instrument、GT接近
1 | - (void)GetCpuUsage { |
此算法是获取当前APP的内存,数值与GT的一致,与Instrument不一致
1 | - (void)GetCurrentTaskUsedMemory { |
2015.11.20
XNU
https://en.wikipedia.org/wiki/XNU
MACH
https://en.wikipedia.org/wiki/Mach_(kernel)
Kernel Programming Guide
github 上搜 mach_msg_type_number_t
https://github.com/search?l=objective-c&q=mach_msg_type_number_t&type=Code&utf8=✓
2015.11.22
用VM Tracker查看内存,有那么几项
Resident Size|Dirty Size|Virtual Size
这篇解释了三者的差别,我理解我们应该跟踪的是Resident Size,但是数值上与VM Tracker上对不上
1 | - (void)GetMemoryStatistics { |
1、关于Ram大小,用HW_MEMSIZE计算得到1000MB,是准确的
2、关于page size,上面提供了三种方法
其中方法一、二在64位机器上返回了16384,只有第三种方法返回了4096
这篇文章提出了此疑问,但是没有特别明确的解释
我认为page size应该是4096,用VM Tracker运行,截图如下:
以第一项_LINKEDIT为例,13692*4096/1024/1024=53.48M,与Vitual Size吻合
3、关于vm_total、vm_wire、vm_active、vm_inactive、vm_free这几个值
其中一组运行结果如下:
1 | Page size is 4096 bytes |
可以看到,Total Memory不是1000MB,这个如何解释呢?
a. 1000M应该是实际的RAM大小,而Total Memory,应该是Virtual Memory,两者是否一回事,有待商榷?
b. 从APP Store上下了一个System Monitor,如下:
可以看到,Wired、Active、Inactive的值都对得上,唯独Free的值对不上
不负责任的猜测,他的Free是通过1000M减其它三项得到的
Source Code : Get Hardware Info of iPhone
http://blog.sina.com.cn/s/blog_4a04a3c90100r9gn.html
How to determine CPU and memory consumption from inside a process?
总结下来,关于内存的有两个问题:
\1. active、inactive、wired、free加起来不等于1000M
这个可以先放一放,我们可以先不用管这部分
\2. 当前app消耗的内存,目前的算法与 Debug Gauges的值有偏差,与GT吻合
不过发现点击页面增长的值和发回释放的值,与Debug Gauges基本一致,因此可以使用
关于CPU,上面算法给出的值符合要求,可以使用;
接下来是:耗电量、网速、帧率
2015.11.23
耗电量,目前没有找到合适的工具
有两种获取电池电量信息的方法
方法一:
这个方法需要导入 IOKit 库,但是不知从什么时候开始,iOS系统不允许用户导入库
http://www.cocoachina.com/bbs/read.php?tid=268692
这篇文章提供了野路子方法,但是实施起来颇为不便,考虑到要做sdk,不适合
1 | CFTypeRef blob = IOPSCopyPowerSourcesInfo(); |
方法二:
1 | [UIDevice currentDevice].batteryLevel |
据说精度达到1%
找到一篇文章,提供了三种方法
http://www.jianshu.com/p/11c1afdf5415
网络流量
2015.11.24
经测试,mach方法获取的内存值与top命令拿到的RSS、VSS是一致的